package org.tri.gui;

import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import org.hibernate.util.HibernateUtil;
import org.tri.entity.Establecimiento;
import org.tri.entity.Productor;

/*
 * El frame {@code MainFrame} es el frame principal del programa.
 * @author kiira.
 * @version 1.0, Jan 2, 2012
 */
public class MainFrame extends javax.swing.JFrame {
    /** Establecimiento manejado por la aplicación. */
    private Establecimiento establecimiento;
    /** Productor manejado por la aplicación. */
    private Productor productor;

    /** Creates new form MainFrame */
    public MainFrame() {
        initComponents();
        jTabbedPane.setEnabledAt( 1, false );
        jTabbedPane.setEnabledAt( 2, false );
        jTabbedPane.setEnabledAt( 3, false );
        
        //comprobamos si entra en la pantalla
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension newSize = this.getPreferredSize();
        
        if ( this.getHeight() > screen.height )
            //el -30 es para dar espacio a el panel de windows
            newSize.height = screen.height - 30;
        if ( this.getWidth() > screen.width )
            newSize.width = screen.width;
        
        this.setSize( newSize );

    }//end constructor

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings ( "unchecked" )
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPStatusBar = new javax.swing.JPanel();
        jLCurrent = new javax.swing.JLabel();
        jTabbedPane = new javax.swing.JTabbedPane();
        jSPMainPanel = new javax.swing.JScrollPane();
        mainPanel = new org.tri.gui.MainPanel( this );
        jSPComprasPanel = new javax.swing.JScrollPane();
        comprasPanel = new org.tri.gui.ComprasPanel( this );
        jSPVentasPanel = new javax.swing.JScrollPane();
        ventasPanel = new org.tri.gui.VentasPanel( this );
        jSPListadosPanel = new javax.swing.JScrollPane();
        listadosPanel = new org.tri.gui.ListadosPanel();
        jMenuBar = new javax.swing.JMenuBar();
        jMArchivo = new javax.swing.JMenu();
        jMISalir = new javax.swing.JMenuItem();
        jMAyuda = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("TRI");
        setName("mainFrame");

        jPStatusBar.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 10, 5));
        jPStatusBar.add(jLCurrent);

        getContentPane().add(jPStatusBar, java.awt.BorderLayout.NORTH);

        jTabbedPane.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        jTabbedPane.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                jTabbedPaneStateChanged(evt);
            }
        });

        jSPMainPanel.setViewportView(mainPanel);

        jTabbedPane.addTab("Principal", jSPMainPanel);

        jSPComprasPanel.setViewportView(comprasPanel);

        jTabbedPane.addTab("Compra", jSPComprasPanel);

        jSPVentasPanel.setViewportView(ventasPanel);

        jTabbedPane.addTab("Ventas", jSPVentasPanel);

        jSPListadosPanel.setViewportView(listadosPanel);

        jTabbedPane.addTab("Listados", jSPListadosPanel);

        getContentPane().add(jTabbedPane, java.awt.BorderLayout.CENTER);
        jTabbedPane.getAccessibleContext().setAccessibleName("tab3");

        jMArchivo.setMnemonic('a');
        jMArchivo.setText("Archivo");

        jMISalir.setMnemonic('s');
        jMISalir.setText("Salir");
        jMISalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMISalirActionPerformed(evt);
            }
        });
        jMArchivo.add(jMISalir);

        jMenuBar.add(jMArchivo);

        jMAyuda.setText("Ayuda");

        jMenuItem1.setText("Acerca de...");
        jMAyuda.add(jMenuItem1);

        jMenuBar.add(jMAyuda);

        setJMenuBar(jMenuBar);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jMISalirActionPerformed( java.awt.event.ActionEvent evt ) {//GEN-FIRST:event_jMISalirActionPerformed
        this.dispose();

        System.exit( 0 );

    }//GEN-LAST:event_jMISalirActionPerformed

    private void jTabbedPaneStateChanged( javax.swing.event.ChangeEvent evt ) {//GEN-FIRST:event_jTabbedPaneStateChanged
        if ( ((JTabbedPane)evt.getSource()).getSelectedIndex() == 2 )
            this.ventasPanel.limpiarListas();
                    
    }//GEN-LAST:event_jTabbedPaneStateChanged

    /**
     * @param args the command line arguments
     */
    public static void main( String args[] ) {
        HibernateUtil.initialize();

        try {
            for ( LookAndFeelInfo info : UIManager.getInstalledLookAndFeels() )
                if ( "Nimbus".equals( info.getName() ) ) {
                    UIManager.setLookAndFeel( info.getClassName() );
                    break;
                }
            
        } catch ( Exception e1 ) {
            try {
                UIManager.setLookAndFeel(
                        UIManager.getSystemLookAndFeelClassName() );
                
            } catch ( Exception e2 ) {}
            
        }

        /* Create and display the form */
        java.awt.EventQueue.invokeLater( new Runnable() {

            @Override
            public void run() {
                new MainFrame().setVisible( true );
            }

        } );
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private org.tri.gui.ComprasPanel comprasPanel;
    private javax.swing.JLabel jLCurrent;
    private javax.swing.JMenu jMArchivo;
    private javax.swing.JMenu jMAyuda;
    private javax.swing.JMenuItem jMISalir;
    private javax.swing.JMenuBar jMenuBar;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JPanel jPStatusBar;
    private javax.swing.JScrollPane jSPComprasPanel;
    private javax.swing.JScrollPane jSPListadosPanel;
    private javax.swing.JScrollPane jSPMainPanel;
    private javax.swing.JScrollPane jSPVentasPanel;
    private javax.swing.JTabbedPane jTabbedPane;
    private org.tri.gui.ListadosPanel listadosPanel;
    private org.tri.gui.MainPanel mainPanel;
    private org.tri.gui.VentasPanel ventasPanel;
    // End of variables declaration//GEN-END:variables

    /**
     * Setea el establecimiento que será utilizado en toda la aplicación.
     * @param establecimiento establecimiento a utilizar.
     */
    public void setEstablecimiento( Establecimiento establecimiento ) {
        //asignamos el establecimiento
        this.establecimiento = establecimiento;
        
        //asignamos el establecimiento al panel de listados
        listadosPanel.setEstablecimiento(establecimiento);
        

        //habilitamos/deshabilitamos los paneles de compra, venta y listado
        boolean isNotNull = establecimiento != null;
        jTabbedPane.setEnabledAt( 1, isNotNull );
        jTabbedPane.setEnabledAt( 2, isNotNull );
        jTabbedPane.setEnabledAt( 3, isNotNull);
        
        //limpiamos los paneles de compra y venta
        comprasPanel.limpiarPanel();
        ventasPanel.limpiarPanel();

        //mostramos el establecimiento actual en la status bar
        jLCurrent.setText( establecimiento != null 
                           ? String.format( "%s > %s",
                                            this.productor.getRazonSocial(),
                                            establecimiento.getNombre() )
                           : productor != null ? productor.getRazonSocial()
                                               : "" );

    }//end método setEstablecimiento

    /**
     * Devuelve el establecimiento utilizado en la aplicación.
     * @return establecimiento utilizado en la aplicación.
     */
    public Establecimiento getEstablecimiento() {
        return establecimiento;

    }//end método getEstablecimiento

    /**
     * Setea el productor utilizado en la aplicación.
     * @param productor productor a utilizar.
     */
    public void setProductor( Productor productor ) {
        //asignamos el productor
        this.productor = productor;
        
        //asignamos el productor al panel de listados
        listadosPanel.setProductor(productor);
        
        //mostramos el productor asignado en la status bar
        jLCurrent.setText( productor != null ? productor.getRazonSocial()
                                             : "" );
        
    }//end método setProductor

    /**
     * Devuelve el productor utilizar en la aplicación.
     * @return productor utilizado en la aplicación.
     */
    public Productor getProductor() {
        return productor;

    }//end método getPoductor
    
    /**
     * Limpia las transacciones actuales del panel de listados.
     */
    public void evictCurrentTransactions() {
        listadosPanel.evictObjects();
        
    }//end método evictCurrentTransactions
    
    /**
     * Este método es utilizado cuando ocurre un error indeterminado en la
     * aplicación y se desea regresar a un estado consistente.
     * Además, muestra un mensaje genérico informando de la situación.
     */
    public void recoverFromFail() {     
        //seteamos el establecimiento y productor nulo
        setProductor( null );
        setEstablecimiento( null );
        
        //limpiamos el panel principal
        mainPanel.limpiarPanel();
        
        //cambiamos la tab al panel principal
        jTabbedPane.setSelectedIndex( 0 );
        
        //mostramos un mensaje de error genérico
        JOptionPane.showMessageDialog( this, 
                                       "Ocurrió un error al intentar "
                                       + "acceder a la base de datos.\n"
                                       + "El estado de la aplicación se "
                                       + "reinició para evitar "
                                       + "inconsistencias.", 
                                       "Error",
                                       JOptionPane.ERROR_MESSAGE );
        
    }//end método recoverFromFail
    
}//end clase MainFrame
